home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995…tember: Reference Library / Dev.CD Sep 95 RL / Dev.CD Sep 95 RL.toast / mac / Technical Documentation / develop / develop Issue 20 code / Scripting the Finder / Zawphing / WindowHandler.cp < prev    next >
Encoding:
Text File  |  1994-10-11  |  11.6 KB  |  328 lines  |  [TEXT/MMCC]

  1. /*================================================================================
  2.     WindowHandler.cp
  3.     
  4.     ©1994 Greg Anderson
  5.     greggor@apple.com
  6.     
  7.     Classes and methods that handle window events
  8.         
  9. ================================================================================*/
  10. #include <AppleEvents.h>
  11. #include "WindowHandler.h"
  12. #include "MacUtilities.h"
  13. #include "DialogUtilities.h"
  14. #include "Exceptions.h"
  15.  
  16.  
  17. //----------------------------------------------------------------------------------------
  18. // GetWindowHandler: 
  19. //
  20. //    Return the window handler stored in the RefCon of this window, or fail if the
  21. //    RefCon of this window does not point to a window handler.
  22. //----------------------------------------------------------------------------------------
  23. TWindowHandler* GetWindowHandler(WindowPtr window)
  24. {
  25.     //
  26.     // Get the window handler from the refCon of the window
  27.     //
  28.     TWindowHandler* handler = nil;
  29.     if(window != nil)
  30.         handler = (TWindowHandler*)GetWRefCon(window);
  31.     
  32.     //
  33.     // If the handler is not valid, then fail
  34.     //
  35.     if((handler == nil) || (PtrValid((Ptr)handler) == false) || (handler->IsValidHandler() == false))
  36.         Throw(eNoWindowHandler);
  37.     
  38.     return handler;
  39. } // GetWindowHandler 
  40.  
  41. //----------------------------------------------------------------------------------------
  42. // TWindowHandler::~TWindowHandler: 
  43. //----------------------------------------------------------------------------------------
  44. TWindowHandler::~TWindowHandler()
  45. {
  46. } // TWindowHandler::~TWindowHandler 
  47.  
  48. //----------------------------------------------------------------------------------------
  49. // TWindowHandler::IWindowHandler: 
  50. //----------------------------------------------------------------------------------------
  51. void TWindowHandler::IWindowHandler(WindowPtr window)
  52. {
  53.     fWindow = window;
  54.     SetWRefCon(window, (long) this);
  55. } // TWindowHandler::IWindowHandler 
  56.  
  57. //----------------------------------------------------------------------------------------
  58. // TWindowHandler::Idle: 
  59. //----------------------------------------------------------------------------------------
  60. void TWindowHandler::Idle(EventRecord* event)
  61. {
  62. } // TWindowHandler::Idle 
  63.  
  64. //----------------------------------------------------------------------------------------
  65. // TWindowHandler::KeyDown: 
  66. //----------------------------------------------------------------------------------------
  67. Boolean TWindowHandler::KeyDown(EventRecord* event, char keyPressed)
  68. {
  69.     return false;
  70. } // TWindowHandler::KeyDown 
  71.  
  72. //----------------------------------------------------------------------------------------
  73. // TWindowHandler::Update: 
  74. //----------------------------------------------------------------------------------------
  75. void TWindowHandler::Update(EventRecord* event)
  76. {
  77. } // TWindowHandler::Update 
  78.  
  79. //----------------------------------------------------------------------------------------
  80. // TWindowHandler::Activate: 
  81. //----------------------------------------------------------------------------------------
  82. void TWindowHandler::Activate(EventRecord* event)
  83. {
  84. } // TWindowHandler::Activate 
  85.  
  86. //----------------------------------------------------------------------------------------
  87. // TWindowHandler::Deactivate: 
  88. //----------------------------------------------------------------------------------------
  89. void TWindowHandler::Deactivate(EventRecord* event)
  90. {
  91. } // TWindowHandler::Deactivate 
  92.  
  93. //----------------------------------------------------------------------------------------
  94. // TWindowHandler::Resume: 
  95. //----------------------------------------------------------------------------------------
  96. void TWindowHandler::Resume(EventRecord* event)
  97. {
  98.     this->Activate(event);
  99. } // TWindowHandler::Resume 
  100.  
  101. //----------------------------------------------------------------------------------------
  102. // TWindowHandler::Suspend: 
  103. //----------------------------------------------------------------------------------------
  104. void TWindowHandler::Suspend(EventRecord* event)
  105. {
  106.     this->Deactivate(event);
  107. } // TWindowHandler::Suspend 
  108.  
  109. //----------------------------------------------------------------------------------------
  110. // TWindowHandler::ContentClick: 
  111. //----------------------------------------------------------------------------------------
  112. Boolean TWindowHandler::ContentClick(EventRecord* event)
  113. {
  114.     return false;
  115. } // TWindowHandler::ContentClick 
  116.  
  117. //----------------------------------------------------------------------------------------
  118. // TWindowHandler::ResizeWindow: 
  119. //----------------------------------------------------------------------------------------
  120. void TWindowHandler::ResizeWindow(Point where)
  121. {
  122. } // TWindowHandler::ResizeWindow 
  123.  
  124. //----------------------------------------------------------------------------------------
  125. // TWindowHandler::CloseAndDelete: 
  126. //----------------------------------------------------------------------------------------
  127. void TWindowHandler::CloseAndDelete()
  128. {
  129.     delete this;
  130. } // TWindowHandler::CloseAndDelete 
  131.  
  132. //----------------------------------------------------------------------------------------
  133. // TWindowHandler::CloseWindowByUser: 
  134. //----------------------------------------------------------------------------------------
  135. void TWindowHandler::CloseWindowByUser()
  136. {
  137.     this->CloseAndDelete();
  138. } // TWindowHandler::CloseWindowByUser 
  139.  
  140. //----------------------------------------------------------------------------------------
  141. // TWindowHandler::SetupCursorShape: 
  142. //----------------------------------------------------------------------------------------
  143. Boolean TWindowHandler::SetupCursorShape(Point localMousePoint, RgnHandle localMouseRgn)
  144. {
  145.     return false;
  146. } // TWindowHandler::SetupCursorShape 
  147.  
  148. //----------------------------------------------------------------------------------------
  149. // TWindowHandler::SetupMenus: 
  150. //
  151. // The frontmost window is given a chance to change the way that menus are enabled
  152. // and disabled
  153. //----------------------------------------------------------------------------------------
  154. void TWindowHandler::SetupMenus()
  155. {
  156. } // TWindowHandler::SetupMenus
  157.  
  158. //----------------------------------------------------------------------------------------
  159. // TWindowHandler::ProcessMenuSelection: 
  160. //
  161. // The frontmost window is given a chance to process a menu command before it is
  162. // passed to the general menu handler
  163. //----------------------------------------------------------------------------------------
  164. Boolean TWindowHandler::ProcessMenuSelection(short commandID)
  165. {
  166.     return false;
  167. } // TWindowHandler::ProcessMenuSelection
  168.  
  169. //----------------------------------------------------------------------------------------
  170. // TWindowHandler::DialogManagerEvent: 
  171. //----------------------------------------------------------------------------------------
  172. void TWindowHandler::DialogManagerEvent(EventRecord* event, short itemHit)
  173. {
  174. } // TWindowHandler::DialogManagerEvent 
  175.  
  176.  
  177. //========================================================================================
  178. // CLASS TModelessDialogHandler
  179. //========================================================================================
  180.  
  181.  
  182. //----------------------------------------------------------------------------------------
  183. // TModelessDialogHandler::~TModelessDialogHandler: 
  184. //----------------------------------------------------------------------------------------
  185. TModelessDialogHandler::~TModelessDialogHandler()
  186. {
  187. } // TModelessDialogHandler::~TModelessDialogHandler 
  188.  
  189. //----------------------------------------------------------------------------------------
  190. // TModelessDialogHandler::IModelessDialogHandler: 
  191. //----------------------------------------------------------------------------------------
  192. void TModelessDialogHandler::IModelessDialogHandler(DialogPtr dialog)
  193. {
  194.     TWindowHandler::IWindowHandler(dialog);    
  195.     
  196.     //
  197.     // Center and display the dialog as soon as it is initialized
  198.     //
  199.     CenterAndShowDialog(dialog);
  200. } // TModelessDialogHandler::IModelessDialogHandler 
  201.  
  202. //----------------------------------------------------------------------------------------
  203. // TModelessDialogHandler::KeyDown: 
  204. //----------------------------------------------------------------------------------------
  205. Boolean TModelessDialogHandler::KeyDown(EventRecord* event, char keyPressed)
  206. {
  207.     Boolean eventHandled = false;
  208.     short defaultButton = ((DialogPeek)this->DialogBoxPtr())->aDefItem;
  209.  
  210.     //
  211.     // Intercept Return if there is a default button
  212.     //    
  213.     if(((keyPressed == '\r') || (keyPressed == '\n')) && (DialogItemEnabled(this->DialogBoxPtr(), defaultButton)))
  214.     {
  215.         FlashDlogItem(this->DialogBoxPtr(), defaultButton);
  216.         this->DialogManagerEvent(event, defaultButton);
  217.         eventHandled = true;
  218.     }
  219.     //
  220.     // We have to handle TAB ourselves, because the dialog manager
  221.     // refuses to skip disabled editText items
  222.     //
  223.     else if(keyPressed == '\t')
  224.     {
  225.         TabToNextEnabledTEItem(this->DialogBoxPtr());
  226.         eventHandled = true;
  227.     }
  228.     //
  229.     // If there are no enabled edit text items, then eat all keypresses
  230.     // (Note:  assumes that item #1 is not an editText item)
  231.     //
  232.     else if(EnabledTEItemsExist(this->DialogBoxPtr()) == false)
  233.     {
  234.         eventHandled = true;
  235.     }
  236.     
  237.     return eventHandled;
  238. } // TModelessDialogHandler::KeyDown 
  239.  
  240. //----------------------------------------------------------------------------------------
  241. // TModelessDialogHandler::ContentClick: 
  242. //
  243. // The dialog manager doesn't deal with deactive TextEdit items very well, so we're
  244. // going to intercept keypresses to inactive editText items here.
  245. //----------------------------------------------------------------------------------------
  246. Boolean TModelessDialogHandler::ContentClick(EventRecord* event)
  247. {
  248.     Rect tRect;
  249.     Handle itemHandle = nil;
  250.     short itemType;
  251.     Point localMousePoint = event->where;
  252.     Boolean eventHandled = false;
  253.     
  254.     //
  255.     // Make 'localMousePoint' really be local
  256.     //
  257.     GlobalToLocal(&localMousePoint);
  258.     
  259.     //
  260.     // Modeless dialog boxes may use FindDItem to find edit text items
  261.     // underneath the cursor
  262.     //
  263.     short itemNum = FindDItem(this->DialogBoxPtr(),localMousePoint) + 1;
  264.     if(itemNum > 0)
  265.     {
  266.         GetDItem(this->DialogBoxPtr(),itemNum,&itemType,&itemHandle,&tRect);
  267.         
  268.         //
  269.         // If the itemType has the 'disabled' bit set, don't pass through
  270.         // mouse clicks (one would think that the dialog manager would take
  271.         // care of this, but disabled editText items do get mouse clicks).
  272.         //
  273.         if(itemType & itemDisable)
  274.             eventHandled = true;
  275.     }
  276.  
  277.     return eventHandled;
  278. } // TModelessDialogHandler::ContentClick 
  279.  
  280. //----------------------------------------------------------------------------------------
  281. // TModelessDialogHandler::CloseAndDelete: 
  282. //----------------------------------------------------------------------------------------
  283. void TModelessDialogHandler::CloseAndDelete()
  284. {
  285.     DisposDialog(this->DialogBoxPtr());
  286.     delete this;
  287. } // TModelessDialogHandler::CloseAndDelete 
  288.  
  289. //----------------------------------------------------------------------------------------
  290. // TModelessDialogHandler::SetupCursorShape: 
  291. //
  292. //    Set the cursor to an I-beam if it passes over an editText item
  293. //----------------------------------------------------------------------------------------
  294. Boolean TModelessDialogHandler::SetupCursorShape(Point localMousePoint, RgnHandle localMouseRgn)
  295. {
  296.     Rect tRect;
  297.     Handle itemHandle = nil;
  298.     short itemType;
  299.     Boolean used = false;
  300.     
  301.     //
  302.     // Modeless dialog boxes may use FindDItem to find edit text items
  303.     // underneath the cursor
  304.     //
  305.     short itemNum = FindDItem(this->DialogBoxPtr(),localMousePoint) + 1;
  306.     if(itemNum > 0)
  307.     {
  308.         GetDItem(this->DialogBoxPtr(),itemNum,&itemType,&itemHandle,&tRect);
  309.         if(itemType == editText)
  310.             ChangeCursor(iBeamCursor);
  311.         else
  312.             ChangeCursor(0);
  313.         
  314.         //
  315.         // We don't need to recalculate the cursor shape as long as we are
  316.         // on top of this control
  317.         //
  318.         if(localMouseRgn != nil)
  319.             RectRgn(localMouseRgn, &tRect);
  320.         used = true;
  321.     }
  322.  
  323.     if(used == false)
  324.         used = TWindowHandler::SetupCursorShape(localMousePoint, localMouseRgn);
  325.     
  326.     return used;
  327. } // TModelessDialogHandler::SetupCursorShape 
  328.